﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace NDF.Collections
{
    /// <summary>
    /// 为基础对象类型 <see cref="System.Object"/> 提供一组用于构建序列或集合的常用工具方法扩展。
    /// </summary>
    public static class ObjectHelper
    {
        /// <summary>
        /// 将当前对象转换成一个枚举列表，列表中的每一项都是一个键值对，其中的 Key 值表示当前对象的属性名，Value 值表示该属性名所对应的值。
        /// 当前对象中所有公共属性名及属性值都将包含在返回的键值对枚举列表中。
        /// </summary>
        /// <typeparam name="?"></typeparam>
        /// <typeparam name="?"></typeparam>
        /// <param name="input"></param>
        /// <returns></returns>
        public static IEnumerable<KeyValuePair<string, object>> ToKeyValuePairs(this object input)
        {
            foreach (var item in input.GetType().GetProperties())
            {
                yield return new KeyValuePair<string, object>(item.Name, item.GetValue(input));
            }
        }

        /// <summary>
        /// 将当前对象转换成一个枚举列表，列表中的每一项都是一个键值对，其中的 Key 值表示当前对象的属性名，Value 值表示该属性名所对应的值。
        /// 当前对象中所有指定作用域范围的属性名及属性值都将包含在返回的键值对枚举列表中。
        /// </summary>
        /// <typeparam name="?"></typeparam>
        /// <typeparam name="?"></typeparam>
        /// <param name="input"></param>
        /// <param name="bindingAttr">定义要转换提取的属性的取值作用域范围。</param>
        /// <returns></returns>
        public static IEnumerable<KeyValuePair<string, object>> ToKeyValuePairs(this object input, BindingFlags bindingAttr)
        {
            foreach (var item in input.GetType().GetProperties(bindingAttr))
            {
                yield return new KeyValuePair<string, object>(item.Name, item.GetValue(input));
            }
        }
    }
}
